package org.tianff.web;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.tianff.util.wechatapi.GenerateWeChatAPI;

import java.util.UUID;

/**
 * Created by Tianff on 2017/7/18.
 * <p>
 * 文档链接  https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=1748234aaf44da7d6e5389734384291e4e68e209&lang=zh_CN
 * 第一步：请求CODE
 * 1. 用户点击图片打开本网站的loginAsWeChat URL： /login/asWeChat
 * 2. /login/asWeChat 映射函数把这个用户请求重定向到微信的登陆API
 * 3. 登陆成功或失败微信都会让用户回调本网站的URL： /callback/recv/code
 * 4. 如果上一步成功，接下来可以通过传回的参数获取access_token
 * <p>
 * 第二步：通过code获取access_token
 * 第三步：通过access_token调用接口
 */
@Controller
public class HomeController {

    @Value("wechat.appid")
    private String appid;

    @Value("wechat.scope")
    private String scope;

    /**
     * FIXME 通过UUID获取一串随机值表示csrf字段或许可取，但是这个值一定要存储到数据库或者其他地方
     * FIXME 只有这样才能判断当用户通过微信登陆后回调的/callback/recv/code链接里的state字段是否是用户请求时本服务生成的
     * FIXME ********************前期可以不做csrf验证***********************
     *
     * @return
     */
    @GetMapping(value = "/login/asWeChat")
    public Object redirectToWeChatOAuth() {

        //微信开发平台回调这个URL来返回access_token
        String callbackURL = "http://139.199.176.126:8080/callback/recv/code";
        String response_type = "";
        String uuid = UUID.randomUUID().toString();

        //FIXME: 在这里对这次请求的用户的uuid存储，否则无法验证csrf（state）字段是否为本服务器发放

        String csrf = "_csrf" + uuid;
        String redirectURL =
                GenerateWeChatAPI.generateOAuthGetCodeAPI(appid, callbackURL,
                        response_type, scope, csrf);

        return "redirect:" + redirectURL;



        
    }


    /**
     * 提供给微信接口，让用户在微信登陆后回调
     *
     * @param code 用于请求access token
     * @param csrf 验证csrf字段
     * @return 重定向到home
     */
    @GetMapping(value = "/callback/recv/code")
    public String callBackRecvCode(@RequestParam(value = "code", required = false) String code,
                                   @RequestParam(value = "state") String csrf) {

        //FIXME 在这里验证csrf（state）字段是否为本服务器发放

        /*
             TODO:  *****************check csrf here****************

             csrf  equals
         */

        //通过code向微信请求access token 本服务作为客户端向微信公众平台发起Http请求


        //通过access token 请求用户的用户名和头像等信息


        //把用户重定向回主页面并显示用户的微信名和微信头像
        return "redirect:home";
    }
}
